package com.example.demo.level1;

import org.junit.jupiter.api.Test;

import java.math.BigDecimal;

public class CasesAboutNumber {

    @SuppressWarnings({"WrapperTypeMayBePrimitive", "ConstantConditions", "NumberEquality"})
    @Test
    public void aboutInteger() {
        Integer a = 128;
        Integer b = 128;
        System.out.println("当包装类是128时， a == b 的结果竟然是: " + (a == b));
        System.out.println("他们分别与128比较的话呢？");
        // Number 类型的包装类在于基础类型的数字进行比较时，会自动拆包，转成int去做比较，所以结果是对的
        System.out.println("(a == 128): " + (a == 128));
        System.out.println("(b == 128): " + (b == 128));

        a = 127;
        b = 127;
        System.out.println("当包装类是127时， a == b 的结果又变成了: " + (a == b));


        /*
         * 包装类的比较，请不要用 == 直接比
         * 要么拆出来，要么转成int，double等基础类型
         * 要么就直接用.equals进行比较
         */
        a = 128;
        b = 128;
        System.out.println("所以我们要避免直接用包装类 ==");
        System.out.println("当包装类是128时， a.equals(b) 的结果: " + (a.equals(b)));
        System.out.println("当包装类是128时， a.intValue() == b.intValue() 的结果: " + (a.intValue() == b.intValue()));
        System.out.println("当包装类是128时， a.doubleValue() == b.doubleValue() 的结果: " + (a.doubleValue() == b.doubleValue()));
        System.out.println("当包装类是128时， a.intValue() == b 的结果: " + (a.intValue() == b));
    }

    @Test
    public void aboutDouble() {
        double a = 1.01;
        double b = 0.41;
        System.out.println(a - b);
        // 结果是 0.6000000000000001
        // 我们需要的结果是 0.6
        // 所以我们要转换成BigDecimal来进行计算
        BigDecimal aa = BigDecimal.valueOf(a);
        BigDecimal bb = BigDecimal.valueOf(b);
        System.out.println(aa.subtract(bb).doubleValue());
        // 注意不要用double进行构造，请使用 BigDecimal.valueOf
        BigDecimal aaa = new BigDecimal(a);
        BigDecimal bbb = new BigDecimal(b);
        System.out.println(aaa.subtract(bbb).doubleValue());
        // float也同理，涉及到金融计算时，请使用BigDecimal
    }

}
